package com.ygxsk.carhome;

import android.app.Activity;
import android.app.Application;
import android.content.Context;

import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.Observer;
import androidx.work.Constraints;
import androidx.work.Data;
import androidx.work.NetworkType;
import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkInfo;
import androidx.work.WorkManager;

import com.blankj.utilcode.util.TimeUtils;
import com.tencent.bugly.crashreport.CrashReport;
import com.tencent.mmkv.MMKV;
import com.umeng.commonsdk.UMConfigure;
import com.umeng.message.PushAgent;
import com.yanzhenjie.album.Album;
import com.yanzhenjie.album.AlbumConfig;
import com.ygxsk.carhome.constant.ConstantSign;
import com.ygxsk.carhome.greendao.CarBrandLargeCategoryDaoManager;
import com.ygxsk.carhome.greendao.CarBrandSeriesLineDaoManager;
import com.ygxsk.carhome.greendao.CardTypeInfoDaoManager;
import com.ygxsk.carhome.greendao.LoginInfoDaoManager;
import com.ygxsk.carhome.helper.PushConstants;
import com.ygxsk.carhome.helper.PushHelper;
import com.ygxsk.carhome.retrofit.ApiService;
import com.ygxsk.carhome.sys.CrashHandler;
import com.ygxsk.carhome.sys.MediaLoader;
import com.ygxsk.carhome.utils.LiuAnUtils;
import com.ygxsk.integrated.retrofit.Parameterkey;

import java.util.Locale;

/*
 * @Author:itchenqi175@163.com
 * @Time:2023-02-02  10:49
 * @Description:做一些初始化的处理
 */
public class CarHelper {


    public static void methodInitThridSDKNoHTTPInShowAgreementDialog(Context _context) {

        //这种事初始化: androidutilscode 和 http的内容；
        if (_context != null) {

            //初始化blankj
            //com.blankj.utilcode.util.Utils.init((Application) _context);

            initLog(ApiService.IS_DEBUG);

            //initX5CoreNomal();
            //---------------------------------------------------------------------------------
            //原始代码是：UMConfigure.submitPolicyGrantResult(getApplicationContext(), true);
            //UMConfigure.submitPolicyGrantResult(_context, true);
            //推送平台多维度推送决策必须调用方法（需要同意隐私政策之后初始化完成调用）
            //初始化友盟消息推送的内容
            //initUmengPushSDK(_context, ApiService.IS_DEBUG);
            //PushAgent.getInstance(_context).onAppStart();
            //---------------------------------------------------------------------------------
            //初始化崩溃的处理或者日志观察
            if (ApiService.IS_DEBUG) {

                //initCrash(_context);
//                xcrash.XCrash.init(_context, new XCrash.InitParameters()
//                        .setLogDir(PathUtils.getExternalAppFilesPath() + File.separator + "xcrash"));

            } else {

//                xcrash.XCrash.init(_context, new XCrash.InitParameters()
//                        .setLogDir(PathUtils.getExternalAppFilesPath() + File.separator + "xcrash"));

                initTenBugly(_context, ApiService.IS_DEBUG);
            }

            Album.initialize(//
                    AlbumConfig.newBuilder(_context)//
                            .setAlbumLoader(new MediaLoader())//
                            .setLocale(Locale.getDefault())//
                            .build());//

            //第一种方式
            LiuAnUtils.init(_context);

            //仅仅是配置workManager
            //Configuration myConfig = new Configuration.Builder()
            //        .setMinimumLoggingLevel(android.util.Log.VERBOSE)
            //        .build();
            //WorkManager.initialize(getBaseContext(), myConfig);
            //===========================================================================
            //初始化用户登录信息的数据库
            LoginInfoDaoManager.getInstance().init(_context);
            //初始化对卡券发放的卡券内容的存储初始化
            CardTypeInfoDaoManager.getInstance().init(_context);
            //全部的车辆品牌的获取
            CarBrandLargeCategoryDaoManager.getInstance().init(_context);
            //车辆品牌-车系的初始化
            CarBrandSeriesLineDaoManager.getInstance().init(_context);
            //============================================================================

            //initWorkManager(_context);

//            try {
//                //do
////                SDKInitializer.setAgreePrivacy(_context,true);
////                SDKInitializer.initialize(_context);
////                //设置规范
////                SDKInitializer.setCoordType(CoordType.BD09LL);
//            } catch (Exception e) {
//                //catch
//                e.printStackTrace();
//            }

        }

    }


    /**
     * 携带有http的内容,这个是比较全面的
     */
    public static void methodInitThridSDKWithHTTPInOnCreate(Context _context) {

        com.blankj.utilcode.util.Utils.init((Application) _context);

        initLog(ApiService.IS_DEBUG);

        //---------------------------------------------------------------------------------
        //初始化友盟的消息
        UMConfigure.submitPolicyGrantResult(_context, true);
        //推送平台多维度推送决策必须调用方法（需要同意隐私政策之后初始化完成调用）
        PushAgent.getInstance(_context).onAppStart();
        //初始化友盟消息推送的内容
        initUmengPushSDK(_context, ApiService.IS_DEBUG);
        //---------------------------------------------------------------------------------
        if (ApiService.IS_DEBUG) {

            //initTenBugly(_context, ApiService.IS_DEBUG);

            //initCrash(_context);
//            xcrash.XCrash.init(_context, new XCrash.InitParameters()
//                    .setLogDir(PathUtils.getExternalAppFilesPath() + File.separator + "xcrash"));

        } else {
            initTenBugly(_context, ApiService.IS_DEBUG);
        }

        Album.initialize(//
                AlbumConfig.newBuilder(_context)//
                        .setAlbumLoader(new MediaLoader())//
                        .setLocale(Locale.getDefault())//
                        .build());//

        //第一种方式
        LiuAnUtils.init(_context);

        //---------------------------------------------------------------------------------
        //初始化用户登录信息的数据库
        LoginInfoDaoManager.getInstance().init(_context);
        //初始化对卡券发放的卡券内容的存储初始化
        CardTypeInfoDaoManager.getInstance().init(_context);
        //车辆品牌的初始化
        CarBrandLargeCategoryDaoManager.getInstance().init(_context);
        //车辆品牌-车系的初始化
        CarBrandSeriesLineDaoManager.getInstance().init(_context);
        //---------------------------------------------------------------------------------

        //initWorkManager(_context);

        //初始化百度地图的默认本地个性化初始化方法
        // 默认本地个性化地图初始化方法
//        try{
//            //do
//            SDKInitializer.setAgreePrivacy(_context,true);
//            SDKInitializer.initialize(_context);
//            //设置规范
//            SDKInitializer.setCoordType(CoordType.BD09LL);
//        }catch(Exception e){
//            //catch
//            e.printStackTrace();
//        }
    }

    //初始化workmanager的之中的X5浏览器
    public static void initWorkManager(Activity _context) {

        try {
            //do
            //定义触发条件
            Constraints constraints = new Constraints.Builder()
                    //NetworkType.NOT REQUIRED: 对网络没有要求
                    //NetworkType.CONNECTED: 网络连接的时候执行
                    //NetworkType.UNMETERED:环计费的网络比如WIFI下执行
                    //NetworkType.NOT ROAMING:非漫游网络状态执行
                    //NetworkType.METERED: 计费网络比如3G，4G下执行
                    .setRequiredNetworkType(NetworkType.NOT_REQUIRED)//对网络没有特别要求
                    .build();

            //传递过去的是当前的时间，如果是【早8:00-晚10:00】
            Data sendData = new Data.Builder().putString(Parameterkey.key, "carhelper" + TimeUtils.getNowString()).build();

            OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(X5CorePreLoadWorkManager.class)
                    //设置触发条件
                    .setConstraints(constraints)
                    .setInputData(sendData)//携带数据
                    .build();

            //获取回馈过来的数据；
            WorkManager.getInstance(_context.getApplicationContext()).getWorkInfoByIdLiveData(workRequest.getId())//
                    .observe((LifecycleOwner) _context, new Observer<WorkInfo>() {//
                        @Override
                        public void onChanged(WorkInfo workInfo) {//

                            //LogUtils.d("itchen----->获取状态机的名称为---->" + workInfo.getState().name());
                            //itchen----->获取状态机的名称为---->RUNNING
                            //itchen----->获取状态机的名称为---->ENQUEUED

                            //状态机：
                            if (workInfo != null && workInfo.getState().isFinished()) {

                                //获取到的数据内容是
                                String dataCallBack = workInfo.getOutputData().getString(Parameterkey.doworkkey);
                                //LogUtils.d("itchen---->获取到的数据是---dataCallBack--->" + dataCallBack);

                            }

                        }
                    });

            //将任务提交给WorkManager
            WorkManager.getInstance(_context).enqueue(workRequest);
//            原文链接：https://blog.csdn.net/fjnu_se/article/details/128179736

        } catch (Exception e) {
            //catch
            if (e != null) {
//                LogUtils.d("itchen---->Exception---dataCallBack--->" + e.getLocalizedMessage());
                // itchen---->Exception---dataCallBack--->com.ygxsk.carhome.CarApplication cannot be cast to androidx.lifecycle.LifecycleOwner
            }
            e.printStackTrace();
        }

    }


    public static void initCrash(Context _context) {

        final CrashHandler myCrashHandler = CrashHandler.getInstance();
        myCrashHandler.init(_context);
        Thread.currentThread().setUncaughtExceptionHandler(myCrashHandler);

    }


    public static void initLog(boolean _isDebug) {

        //final com.blankj.utilcode.util.LogUtils.Config config = com.blankj.utilcode.util.LogUtils.getConfig()
        com.blankj.utilcode.util.LogUtils.getConfig()
                .setLogSwitch(_isDebug)// 设置 log 总开关，包括输出到控制台和文件，默认开
                .setConsoleSwitch(_isDebug)// 设置是否输出到控制台开关，默认开
                .setGlobalTag("itchen")// 设置 log 全局标签，默认为空
                // 当全局标签不为空时，我们输出的 log 全部为该 tag，
                // 为空时，如果传入的 tag 为空那就显示类名，否则显示 tag
                .setLogHeadSwitch(_isDebug)// 设置 log 头信息开关，默认为开
                .setLog2FileSwitch(true)// 打印 log 时是否存到文件的开关，默认关
                .setSingleTagSwitch(true)// 一条日志仅输出一条，默认开，为美化 AS 3.1 的 Logcat
                .setDir("")// 当自定义路径为空时，写入应用的/cache/log/目录中
                .setFilePrefix("itchen")// 当文件前缀为空时，默认为"util"，即写入文件为"util-MM-dd.txt"
                .setBorderSwitch(false)// 输出日志是否带边框开关，默认开
                .setConsoleFilter(com.blankj.utilcode.util.LogUtils.V)// log 的控制台过滤器，和 logcat 过滤器同理，默认 Verbose ：itchen 仅仅打印普通的日志
                .setFileFilter(com.blankj.utilcode.util.LogUtils.V)// log 文件过滤器，和 logcat 过滤器同理，默认 Verbose：itchen仅仅记录报错的日志
                .setStackDeep(1)// log 栈深度，默认为 1
                .setSaveDays(100);//  设置日志可保留天数，默认为 -1 表示无限时长

    }

    private static void initTenBugly(Context context, boolean _isDebug) {

//        //为了提高合作方的webview场景稳定性，及时发现并解决x5相关问题，当客户端发生crash等异常情况并上报给服务器时请务必带上x5内核相关信息
//        // 。x5内核异常信息获取接口为：com.tencent.smtt.sdk.WebView.getCrashExtraMessage(context)。以bugly日志上报为例：
//        CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(this.getApplicationContext());
//        strategy.setCrashHandleCallback(new CrashReport.CrashHandleCallback() {
//            public Map<String, String> onCrashHandleStart(
//                    int crashType,
//                    String errorType,
//                    String errorMessage,
//                    String errorStack) {
//
//                LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
//                String x5CrashInfo = com.tencent.smtt.sdk.WebView.getCrashExtraMessage(_instance);
//                map.put("x5crashInfo", x5CrashInfo);
//                return map;
//            }
//
//            @Override
//            public byte[] onCrashHandleStart2GetExtraDatas(
//                    int crashType,
//                    String errorType,
//                    String errorMessage,
//                    String errorStack) {
//                try {
//                    return "Extra data.".getBytes(StandardCharsets.UTF_8);
//                } catch (Exception e) {
//                    return null;
//                }
//            }
//        });

        //========================================================================================================================
        CrashReport.initCrashReport(context, PushConstants.BUGLYID, _isDebug);//真实的三农云管家的key_id，App ID
        //========================================================================================================================

    }

    /**
     * 初始化推送SDK，在用户隐私政策协议同意后，再做初始化
     */
    public static void initUmengPushSDK(Context _context, boolean _isDebug) {
        /*
         * 判断用户是否已同意隐私政策
         * 当同意时，直接进行初始化；
         * 当未同意时，待用户同意后，通过 PushHelper.init(...) 方法进行初始化。
         */
        boolean agreed = MMKV.defaultMMKV().decodeBool(ConstantSign.P_SECRECYTURL_AGREE);

        if (agreed && PushHelper.isMainProcess(_context)) {

            //设置LOG开关，true 就是打开测试开关，默认为 false 不打开测试开关
            /**
             * 注意: 即使您已经在 AndroidManifest.xml 中配置过appkey和channel值，也需要在App代码中调
             * 用初始化接口（如需要使用AndroidManifest.xml中配置好的appkey和channel值，
             * UMConfigure.init调用中appkey和channel参数请置为null）。
             * * 注意：如果您已经在AndroidManifest.xml中配置过appkey和channel值，可以调用此版本初始化函数。
             */
            //日志开关
            UMConfigure.setLogEnabled(_isDebug);
            //预初始化
            PushHelper.preInit(_context);

            //UMConfigure.UMinit(getApplicationContext());

            //启动服务,播放友盟推送声音的；
            //2022年5月31日 bug 发现这里启动服务会造成：[android.app.RemoteServiceException: Context.startForegroundService() did]的bug;
            //PushHelper.startServiceWithNoBundle(getApplicationContext());

            //建议在线程中执行初始化
            new Thread(new Runnable() {
                @Override
                public void run() {
                    PushHelper.init(_context);
                }
            }).start();


        } else {
            //若不是主进程（":channel"结尾的进程），直接初始化sdk，不可在子线程中执行
            if (agreed) {
                //若不是主进程（":channel"结尾的进程），直接初始化sdk，不可在子线程中执行
                PushHelper.init(_context);

            } else {
//                LogUtils.d(ConstantApi.LOGCAT_NOMAL + "用户还没有点击【同意】还不能从友盟这里获取-deviceToken");
            }
        }
    }


}
